RAIS  3.2
C:/Projekte/RAIS/common/SpecificReport.cs
Go to the documentation of this file.
00001 using System;
00002 using System.Collections.Generic;
00003 using System.Text;
00004 using System.Xml;
00005 using System.IO;
00006 
00007 namespace RAIS.Common
00008 {
00009     public class SpecificReport
00010     {
00011         #region FIELDS
00012         private XmlDocument xmlReport;
00013         private XmlNamespaceManager manager;
00014         private Dictionary<XmlNode, SpecificReportFieldType> reportFields;
00015         private List<XmlNode> reportImages;
00016         private int reportID;
00017         #endregion
00018 
00019         #region PROPERTIES
00020         public enum SpecificReportFieldType
00021         {
00022             Textbox,
00023             List,
00024             Table,
00025             Subreport,
00026             Image
00027         };
00028         public Dictionary<string, SpecificReportFieldType> _ReportFields
00029         {
00030             get
00031             {
00032                 Dictionary<string, SpecificReportFieldType> result = new Dictionary<string, SpecificReportFieldType>();
00033                 foreach (KeyValuePair<XmlNode, SpecificReportFieldType> pair in reportFields)
00034                 {
00035                     XmlNode reportFieldNode = pair.Key;
00036                     SpecificReportFieldType reportFieldType = pair.Value;
00037                     result.Add(reportFieldNode.Attributes["Name"].Value.ToString(), reportFieldType);
00038                 }
00039                 return result;
00040             }
00041         }
00042         public List<string> _ReportImages
00043         {
00044             get
00045             {
00046                 List<string> result = new List<string>();
00047                 foreach (XmlNode imageNode in reportImages)
00048                 {
00049                     result.Add(imageNode.Attributes["Name"].Value);
00050                 }
00051                 return result;
00052             }
00053         }
00054         public int SpecificReportID { get { return this.reportID; } }
00055         #endregion
00056 
00057         // Constructor
00058         public SpecificReport(int reportID, string reportDefinition)
00059         {
00060             this.reportID = reportID;
00061             reportFields = new Dictionary<XmlNode, SpecificReportFieldType>();
00062             reportImages = new List<XmlNode>();
00063             loadReport(reportDefinition);
00064         }
00065 
00066         #region PRIVATE METHODS
00067         private void loadReport(string reportDefinition)
00068         {
00069             xmlReport = new XmlDocument();
00070             xmlReport.LoadXml(reportDefinition);
00071             manager = new XmlNamespaceManager(xmlReport.NameTable);
00072             manager.AddNamespace("def", xmlReport.DocumentElement.NamespaceURI);
00073 
00074             #region INIT REPORT FIELDS
00075             // Init textboxes
00076             XmlNodeList nodes = xmlReport.GetElementsByTagName("Textbox");
00077             foreach (XmlNode node in nodes)
00078             {
00079                 if (node.Attributes["Name"] != null)
00080                 {
00081                     XmlNode valueNode = xmlReport.SelectSingleNode("//def:Textbox[@Name='" + node.Attributes["Name"].Value + "']/def:Value", manager);
00082                     if (valueNode != null && (String.IsNullOrEmpty(valueNode.InnerText) || valueNode.InnerText.StartsWith("=Fields!")))
00083                         reportFields.Add(node, SpecificReportFieldType.Textbox);
00084                 }
00085             }
00086             // Init lists
00087             nodes = xmlReport.GetElementsByTagName("List");
00088             foreach (XmlNode node in nodes)
00089             {
00090                 if (node.Attributes["Name"] != null)
00091                 {
00092                     reportFields.Add(node, SpecificReportFieldType.List);
00093                 }
00094             }
00095             // Init tables
00096             nodes = xmlReport.GetElementsByTagName("Table");
00097             foreach (XmlNode node in nodes)
00098             {
00099                 if (node.Attributes["Name"] != null)
00100                 {
00101                     reportFields.Add(node, SpecificReportFieldType.Table);
00102                 }
00103             }
00104             // Init subreports
00105             nodes = xmlReport.GetElementsByTagName("Subreport");
00106             foreach (XmlNode node in nodes)
00107             {
00108                 if (node.Attributes["Name"] != null)
00109                 {
00110                     reportFields.Add(node, SpecificReportFieldType.Subreport);
00111                 }
00112             }
00113             #endregion
00114 
00115             #region INIT REPORT IMAGES
00116             nodes = xmlReport.GetElementsByTagName("Image");
00117             foreach (XmlNode node in nodes)
00118             {
00119                 if (node.Attributes["Name"] != null)
00120                 {
00121                     reportImages.Add(node);
00122                 }
00123             }
00124             #endregion
00125         }
00126         private string writeXmlToString()
00127         {
00128             StringWriter sw = new StringWriter();
00129             XmlTextWriter xw = new XmlTextWriter(sw);
00130             xmlReport.WriteTo(xw);
00131             return sw.ToString();
00132         }
00133         private bool isPartOfTableGrouping(string reportField)
00134         {
00135             XmlNode node = xmlReport.SelectSingleNode("//def:Table/def:TableGroups/def:TableGroup/def:Header/def:TableRows/def:TableRow/def:TableCells/def:TableCell/def:ReportItems/def:Textbox[@Name='" + reportField + "']", manager);
00136             if (node != null)
00137                 return true;
00138             else return false;
00139         }
00140         private bool hasTableGrouping(XmlNode tableNode)
00141         {
00142             XmlNode node = tableNode.SelectSingleNode("//def:TableGroups", manager);
00143             if (node != null)
00144                 return true;
00145             else return false;
00146         }
00147         #endregion
00148 
00149         #region PUBLIC METHODS
00150         public string GetFieldConnection(string reportField, string queryField)
00151         {
00152             XmlNode valueNode = xmlReport.SelectSingleNode("//def:Textbox[@Name='" + reportField + "']/def:Value", manager);
00153             if (valueNode != null)
00154             {
00155                 if (queryField != String.Empty)
00156                     valueNode.InnerText = "=Fields!" + queryField.Replace(' ', '_') + ".Value";
00157                 else
00158                     valueNode.InnerText = String.Empty;
00159             }
00160             return writeXmlToString();
00161         }
00162         public string GetFieldConnection(string reportField, string queryField, bool tableGrouping)
00163         {
00164             XmlNode valueNode = xmlReport.SelectSingleNode("//def:Textbox[@Name='" + reportField + "']/def:Value", manager);
00165             if (valueNode != null)
00166             {
00167                 if (queryField != String.Empty)
00168                     valueNode.InnerText = "=Fields!" + queryField.Replace(' ', '_') + ".Value";
00169                 else
00170                     valueNode.InnerText = String.Empty;
00171             }
00172 
00173             XmlNode rowNode = valueNode.ParentNode.ParentNode.ParentNode.ParentNode.ParentNode;
00174             XmlNode oldRowNodes = rowNode.ParentNode;
00175             if (tableGrouping && !isPartOfTableGrouping(reportField))
00176             {
00177                 XmlAttribute att = xmlReport.CreateAttribute("PrevGroup");
00178                 att.Value = rowNode.ParentNode.ParentNode.Name;
00179                 rowNode.Attributes.Append(att);
00180 
00181                 XmlNode tableRows = null;
00182                 XmlNode tableNode = rowNode.ParentNode.ParentNode.ParentNode;
00183                 if (!hasTableGrouping(tableNode))
00184                 {
00185                     XmlNode tableGroups = xmlReport.CreateElement("TableGroups", tableNode.NamespaceURI);
00186                     XmlNode tableGroup = xmlReport.CreateElement("TableGroup", tableGroups.NamespaceURI);
00187                     XmlNode grouping = xmlReport.CreateElement("Grouping", tableGroup.NamespaceURI);
00188                     XmlAttribute groupingName = xmlReport.CreateAttribute("Name");
00189                     groupingName.Value = reportField + "_Grouping";
00190                     XmlNode groupExpressions = xmlReport.CreateElement("GroupExpressions", grouping.NamespaceURI);
00191                     XmlNode groupExpression = xmlReport.CreateElement("GroupExpression", groupExpressions.NamespaceURI);
00192                     XmlNode pageBreakNode = xmlReport.CreateElement("PageBreakAtEnd", grouping.NamespaceURI);
00193                     pageBreakNode.InnerText = "false";
00194 
00195                     groupExpressions.AppendChild(groupExpression);
00196                     grouping.AppendChild(groupExpressions);
00197                     grouping.AppendChild(pageBreakNode);
00198                     grouping.Attributes.Append(groupingName);
00199                     tableGroup.AppendChild(grouping);
00200                     tableGroups.AppendChild(tableGroup);
00201                     tableNode.AppendChild(tableGroups);
00202                 }
00203 
00204                 tableRows = tableNode.SelectSingleNode("//def:TableGroups/def:TableGroup/def:Header/def:TableRows", manager);
00205                 if (tableRows == null)
00206                 {
00207                     XmlNode tableGroup = tableNode.SelectSingleNode("//def:TableGroups/def:TableGroup", manager);
00208                     XmlNode header = xmlReport.CreateElement("Header", tableGroup.NamespaceURI);
00209                     tableRows = xmlReport.CreateElement("TableRows", header.NamespaceURI);
00210 
00211                     header.AppendChild(tableRows);
00212                     tableGroup.AppendChild(header);
00213                 }
00214                 tableRows.AppendChild(rowNode);
00215 
00216                 if (oldRowNodes.ChildNodes.Count == 0)
00217                     tableNode.RemoveChild(oldRowNodes.ParentNode);
00218             }
00219             else if (!tableGrouping && isPartOfTableGrouping(reportField))
00220             {
00221                 string prevGroup = rowNode.Attributes["PrevGroup"].Value;
00222                 XmlNode tableNode = rowNode.ParentNode.ParentNode.ParentNode.ParentNode.ParentNode;
00223                 XmlNode tableRows = tableNode.SelectSingleNode("//def:Table/def:" + prevGroup + "/def:TableRows", manager);
00224 
00225                 if (tableRows != null)
00226                 {
00227                     tableRows.InsertBefore(rowNode, tableRows.FirstChild);
00228                 }
00229                 else
00230                 {
00231                     XmlNode groupNode = xmlReport.CreateElement(prevGroup, tableNode.NamespaceURI);
00232                     tableRows = xmlReport.CreateElement("TableRows", groupNode.NamespaceURI);
00233                     tableRows.AppendChild(rowNode);
00234                     groupNode.AppendChild(tableRows);
00235                     tableNode.AppendChild(groupNode);
00236                 }
00237                 if (oldRowNodes.ChildNodes.Count == 0)
00238                     tableNode.SelectSingleNode("//def:TableGroups/def:TableGroup", manager).RemoveChild(oldRowNodes.ParentNode);
00239             }
00240             return writeXmlToString();
00241         }
00242         public string GetListConnection(string reportField, string queryField, bool pageBreak)
00243         {
00244             foreach (KeyValuePair<XmlNode, SpecificReportFieldType> pair in reportFields)
00245             {
00246                 XmlNode reportFieldNode = pair.Key;
00247                 if (pair.Value == SpecificReportFieldType.List && reportFieldNode.Attributes["Name"].Value.Equals(reportField))
00248                 {
00249                     foreach (XmlNode node in reportFieldNode.ChildNodes)
00250                     {
00251                         if (node.Name.Equals("Grouping"))
00252                         {
00253                             reportFieldNode.RemoveChild(node);
00254                         }
00255                     }
00256                     if (queryField != String.Empty)
00257                     {
00258                         XmlNode groupingNode = xmlReport.CreateElement("Grouping", reportFieldNode.NamespaceURI);
00259                         XmlAttribute groupingName = xmlReport.CreateAttribute("Name");
00260                         groupingName.Value = reportField + "_Grouping";
00261                         XmlNode pageBreakNode = xmlReport.CreateElement("PageBreakAtEnd", groupingNode.NamespaceURI);
00262                         pageBreakNode.InnerText = pageBreak.ToString().ToLower();
00263                         XmlNode groupExpressions = xmlReport.CreateElement("GroupExpressions", groupingNode.NamespaceURI);
00264                         XmlNode groupExpression = xmlReport.CreateElement("GroupExpression", groupExpressions.NamespaceURI);
00265 
00266                         groupExpression.InnerText = "=Fields!" + queryField.Replace(' ', '_') + ".Value";
00267 
00268                         groupExpressions.AppendChild(groupExpression);
00269                         groupingNode.AppendChild(groupExpressions);
00270                         groupingNode.Attributes.Append(groupingName);
00271                         groupingNode.AppendChild(pageBreakNode);
00272                         reportFieldNode.AppendChild(groupingNode);
00273                     }
00274                     break;
00275                 }
00276             }
00277             return writeXmlToString();
00278         }
00279         public string GetTableConnection(string reportField, string queryField, bool pageBreak)
00280         {
00281             string query = "//def:Table[@Name='" + reportField + "']";
00282             XmlNode tableNode = xmlReport.SelectSingleNode(query, manager);
00283 
00284             if (queryField != String.Empty)
00285             {
00286                 if (xmlReport.SelectSingleNode("//def:Table[@Name='" + reportField + "']/def:TableGroups/def:TableGroup/def:Grouping/def:GroupExpressions/def:GroupExpression", manager) != null)
00287                 {
00288                     XmlNode groupExpression = xmlReport.SelectSingleNode("//def:Table[@Name='" + reportField + "']/def:TableGroups/def:TableGroup/def:Grouping/def:GroupExpressions/def:GroupExpression", manager);
00289                     groupExpression.InnerText = "=Fields!" + queryField.Replace(' ', '_') + ".Value";
00290 
00291                     XmlNode pageBreakNode = xmlReport.SelectSingleNode("//def:Table[@Name='" + reportField + "']/def:TableGroups/def:TableGroup/def:Grouping/def:PageBreakAtEnd", manager);
00292                     if (pageBreakNode != null)
00293                         pageBreakNode.InnerText = pageBreak.ToString().ToLower();
00294                     else
00295                     {
00296                         XmlNode grouping = xmlReport.SelectSingleNode("//def:Table[@Name='" + reportField + "']/def:TableGroups/def:TableGroup/def:Grouping", manager);
00297                         pageBreakNode = xmlReport.CreateElement("PageBreakAtEnd", grouping.NamespaceURI);
00298                         pageBreakNode.InnerText = pageBreak.ToString().ToLower();
00299                         grouping.AppendChild(pageBreakNode);
00300                     }
00301                 }
00302                 else
00303                 {
00304                     XmlNode tableGroups = xmlReport.CreateElement("TableGroups", tableNode.NamespaceURI);
00305                     XmlNode tableGroup = xmlReport.CreateElement("TableGroup", tableGroups.NamespaceURI);
00306                     XmlNode grouping = xmlReport.CreateElement("Grouping", tableGroup.NamespaceURI);
00307                     XmlAttribute groupingName = xmlReport.CreateAttribute("Name");
00308                     groupingName.Value = reportField + "_Grouping";
00309                     XmlNode groupExpressions = xmlReport.CreateElement("GroupExpressions", grouping.NamespaceURI);
00310                     XmlNode groupExpression = xmlReport.CreateElement("GroupExpression", groupExpressions.NamespaceURI);
00311                     groupExpression.InnerText = "=Fields!" + queryField.Replace(' ', '_') + ".Value";
00312                     XmlNode pageBreakNode = xmlReport.CreateElement("PageBreakAtEnd", grouping.NamespaceURI);
00313                     pageBreakNode.InnerText = pageBreak.ToString().ToLower();
00314                     //XmlNode header = xmlReport.CreateElement("Header", tableGroup.NamespaceURI);
00315                     //XmlNode tableRows = xmlReport.CreateElement("TableRows", header.NamespaceURI);
00316 
00317                     //header.AppendChild(tableRows);
00318                     groupExpressions.AppendChild(groupExpression);
00319                     grouping.AppendChild(groupExpressions);
00320                     grouping.AppendChild(pageBreakNode);
00321                     grouping.Attributes.Append(groupingName);
00322                     tableGroup.AppendChild(grouping);
00323                     //tableGroup.AppendChild(header);
00324                     tableGroups.AppendChild(tableGroup);
00325                     tableNode.AppendChild(tableGroups);
00326                 }
00327             }
00328             else
00329             {
00330                 if (xmlReport.SelectSingleNode("//def:Table[@Name='" + reportField + "']/def:TableGroups/def:TableGroup/def:Grouping/def:GroupExpressions/def:GroupExpression", manager) != null)
00331                 {
00332                     XmlNode groupExpression = xmlReport.SelectSingleNode("//def:Table[@Name='" + reportField + "']/def:TableGroups/def:TableGroup/def:Grouping/def:GroupExpressions/def:GroupExpression", manager);
00333                     groupExpression.InnerText = String.Empty;
00334 
00335                     XmlNode pageBreakNode = xmlReport.SelectSingleNode("//def:Table[@Name='" + reportField + "']/def:TableGroups/def:TableGroup/def:Grouping/def:PageBreakAtEnd", manager);
00336                     if (pageBreakNode != null)
00337                         pageBreakNode.InnerText = pageBreak.ToString().ToLower();
00338                     else
00339                     {
00340                         XmlNode grouping = xmlReport.SelectSingleNode("//def:Table[@Name='" + reportField + "']/def:TableGroups/def:TableGroup/def:Grouping", manager);
00341                         pageBreakNode = xmlReport.CreateElement("PageBreakAtEnd", grouping.NamespaceURI);
00342                         pageBreakNode.InnerText = pageBreak.ToString().ToLower();
00343                         grouping.AppendChild(pageBreakNode);
00344                     }
00345                 }
00346             }
00347             return writeXmlToString();
00348         }
00349         public string GetSubreportConnection(string reportField, string specificReportName)
00350         {
00351             XmlNode node = xmlReport.SelectSingleNode("//def:Subreport[@Name='" + reportField + "']/def:ReportName", manager);
00352             if (node != null)
00353             {
00354                 node.InnerText = specificReportName;
00355             }
00356             return writeXmlToString();
00357         }
00358         public string GetConnectedDataField(string reportField, SpecificReportFieldType type, ref bool cbxChecked)
00359         {
00360             if (type == SpecificReportFieldType.Textbox)
00361             {
00362                 foreach (KeyValuePair<XmlNode, SpecificReportFieldType> pair in reportFields)
00363                 {
00364                     XmlNode reportFieldNode = pair.Key;
00365                     if (reportFieldNode.Attributes["Name"].Value.Equals(reportField))
00366                     {
00367                         foreach (XmlNode childNode in reportFieldNode.ChildNodes)
00368                         {
00369                             if (childNode.Name.Equals("Value"))
00370                             {
00371                                 if (isPartOfTableGrouping(reportField))
00372                                     cbxChecked = true;
00373                                 if (childNode.InnerText.StartsWith("=Fields!"))
00374                                     return childNode.InnerText.Substring(childNode.InnerText.IndexOf('!') + 1, childNode.InnerText.Length - 14).Replace('_', ' ');
00375                                 else
00376                                     break;
00377                             }
00378                         }
00379                         break;
00380                     }
00381                 }
00382             }
00383             else if (type == SpecificReportFieldType.List)
00384             {
00385                 string result = String.Empty;
00386                 foreach (KeyValuePair<XmlNode, SpecificReportFieldType> pair in reportFields)
00387                 {
00388                     XmlNode reportFieldNode = pair.Key;
00389                     if (reportFieldNode.Attributes["Name"].Value.Equals(reportField))
00390                     {
00391                         foreach (XmlNode groupingNode in reportFieldNode.ChildNodes)
00392                         {
00393                             if (groupingNode.Name.Equals("Grouping"))
00394                             {
00395                                 foreach (XmlNode childNode in groupingNode.ChildNodes)
00396                                 {
00397                                     if (childNode.Name.Equals("GroupExpressions"))
00398                                         result = childNode.ChildNodes[0].InnerText.Substring(childNode.InnerText.IndexOf('!') + 1, childNode.InnerText.Length - 14).Replace('_', ' ');
00399                                     else if (childNode.Name.Equals("PageBreakAtEnd"))
00400                                         cbxChecked = Convert.ToBoolean(childNode.InnerText);
00401                                 }
00402                             }
00403                         }
00404                     }
00405                 }
00406                 return result;
00407             }
00408             else if (type == SpecificReportFieldType.Table)
00409             {
00410                 string query = "//def:Table[@Name='" + reportField + "']/def:TableGroups/def:TableGroup/def:Grouping/def:GroupExpressions/def:GroupExpression";
00411                 XmlNode groupExpression = xmlReport.SelectSingleNode(query, manager);
00412                 if (groupExpression != null && groupExpression.InnerText.Length > 0)
00413                 {
00414                     string result = groupExpression.InnerText.Substring(groupExpression.InnerText.IndexOf('!') + 1, groupExpression.InnerText.Length - 14).Replace('_', ' ');
00415                     query = "//def:Table[@Name='" + reportField + "']/def:TableGroups/def:TableGroup/def:Grouping/def:PageBreakAtEnd";
00416                     XmlNode pageBreakNode = xmlReport.SelectSingleNode(query, manager);
00417                     if (pageBreakNode != null)
00418                         cbxChecked = Convert.ToBoolean(pageBreakNode.InnerText);
00419                     return result;
00420                 }
00421             }
00422             else if (type == SpecificReportFieldType.Subreport)
00423             {
00424                 string query = "//def:Subreport[@Name='" + reportField + "']/def:ReportName";
00425                 XmlNode node = xmlReport.SelectSingleNode(query, manager);
00426                 //if (node != null)
00427                 return node.InnerText;
00428             }
00429             return null;
00430         }
00431         public SpecificReportFieldType GetFieldTypeFromString(string type)
00432         {
00433             switch (type)
00434             {
00435                 case "List":
00436                     return SpecificReportFieldType.List;
00437                 case "Table":
00438                     return SpecificReportFieldType.Table;
00439                 case "Subreport":
00440                     return SpecificReportFieldType.Subreport;
00441                 case "Image":
00442                     return SpecificReportFieldType.Image;
00443             }
00444             return SpecificReportFieldType.Textbox;
00445         }
00446         public bool IsPartOfTable(string reportField)
00447         {
00448             string query = "//def:Textbox[@Name='" + reportField + "']";
00449             XmlNode textboxNode = xmlReport.SelectSingleNode(query, manager);
00450             if (textboxNode.ParentNode.ParentNode.Name.Equals("TableCell"))
00451                 return true;
00452             else return false;
00453         }
00454         #endregion
00455     }
00456 }